package com.mokylin.dbschema.util;

import com.mokylin.dbschema.config.ConfigInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * 配置加载：数据库->环境变量->dbschema.properties
 * @author 李朝(Li.Zhao)
 * @since 2015/9/1.
 */

public class PropertyUtils {
    private static final Logger log = LoggerFactory.getLogger(ConfigInfo.class);


    private PropertyUtils() {
    }

    public static String getString(Enum key) {
        return getString(key.name());
    }

    public static long getLong(Enum key) {
        return getLong(key.toString());
    }

    public static long getLong(String key) {
       return getLong(key,0L);
    }

    public static Long getLong(String key,long defaultVal){
        String config = DbConfigUtils.getConfig(key);
        if(StringUtils.isNotBlank(config)){
            return Long.parseLong(config);
        }
        return EnvConfigUtils.getLong(key,defaultVal);
    }

    public static int getInt(Enum key) {
        return getInt(key.toString());
    }

    public static int getInt(String key,int defaultVal){
        String config = DbConfigUtils.getConfig(key);
        if(StringUtils.isNotBlank(config)){
            try {
                return Integer.parseInt(config);
            } catch (NumberFormatException e) {
                log.warn(e.getMessage(), e);
            }
        }
        return EnvConfigUtils.getInt(key, defaultVal);
    }

    public static String getString(String str) {
        String res = DbConfigUtils.getConfig(str);
        if(StringUtils.isBlank(res)){
            res  = EnvConfigUtils.getString(str);
        }
        return res;
    }

    public static String getString(String str,String defaultVal) {
        String res = DbConfigUtils.getConfig(str);
        if(StringUtils.isBlank(res)){
            res  = EnvConfigUtils.getString(str);
        }
        return StringUtils.isBlank(res)?defaultVal:res;
    }


    public static int getInt(String key) {
        return getInt(key,0);
    }

    public static Map<String, String> getStringByRegex(String regex) {
        Map<String, String> res = EnvConfigUtils.getStringByRegex(regex);
        DbConfigUtils.asMap().entrySet().stream().filter(e -> e.getKey().matches(regex)).forEach((e)->res.put(e.getKey(),e.getValue()));
        return res;
    }

    public static Map<String, Integer> getIntByRegex(String regex) {
        Map<String, Integer> res = EnvConfigUtils.getIntByRegex(regex);
        DbConfigUtils.asMap().entrySet().stream().filter(e -> e.getKey().matches(regex)).forEach((e) -> {
            int value = 0;
            try {
                value = Integer.parseInt(e.getValue());
            } catch (NumberFormatException e1) {
                log.warn(e1.getMessage(),e1);
            }
            res.put(e.getKey(), value);
        });
        return res;
    }

    public static boolean getBoolean(String key) {
        return Boolean.parseBoolean(getString(key));
    }
}
